package ar.uade.edu.fain.ad.server.business;

import java.util.ArrayList;
import java.util.List;

import ar.uade.edu.fain.ad.common.exception.PedidoCerradoException;
import ar.uade.edu.fain.ad.common.transfer.MozoVO;
import ar.uade.edu.fain.ad.common.transfer.PedidoVO;

public class Pedido {

	private Long id;
	private Mesa mesa;
	private Mozo mozo;
	private List<Comanda> comandas;
	private Boolean estadoPedido;
	private Factura factura;

	public Pedido() {
		super();
		this.comandas = new ArrayList<Comanda>();
		this.estadoPedido = true;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Mesa getMesa() {
		return mesa;
	}

	public void setMesa(Mesa mesa) {
		this.mesa = mesa;
	}

	public Mozo getMozo() {
		return mozo;
	}

	public void setMozo(Mozo mozo) {
		this.mozo = mozo;
	}

	public List<Comanda> getComandas() {
		return comandas;
	}

	public void setComandas(List<Comanda> comandas) {
		this.comandas = comandas;
	}

	public Boolean getEstadoPedido() {
		return estadoPedido;
	}

	public void setEstadoPedido(Boolean estadoPedido) {
		this.estadoPedido = estadoPedido;
	}
	
	public Factura getFactura() {
		return factura;
	}
	
	public void setFactura(Factura factura) {
		this.factura = factura;
	}
	
	public boolean isFacturado() {
		return getFactura() != null;
	}

	public boolean isPago() {
		return isFacturado() && getFactura().isPaga();
	}
	
	public void asociarA(Mozo mozo) {
		if (mozo == null) {
			throw new IllegalArgumentException(
					"Se necesita un mozo para asociar al pedido.");
		}
		setMozo(mozo);
	}
	
	public void agregar(Plato plato, Integer cantidad) {
		if (cantidad == null || plato == null) {
			throw new IllegalArgumentException(
					"Se necesita plato y cantidad para crear " +
					"una comanda en el pedido.");
		}
		Comanda comanda = new Comanda();
		comanda.setPlato(plato);
		comanda.setCantidad(cantidad);
		getComandas().add(comanda);
	}
	
	public PedidoVO toVO() {
		PedidoVO vo = new PedidoVO();
		vo.setId(getId());
		vo.setEstado(getEstadoPedido());
		vo.setMesa(getMesa().toVO());
		vo.setMozo((MozoVO)getMozo().toVO());
		return vo;
	}

	public void cerrar() throws PedidoCerradoException {
		if (!getEstadoPedido()) {
			throw new PedidoCerradoException(this.toVO());
		}
		setEstadoPedido(false);
	}
	
}
